# 状态模式是一种设计模式，它允许一个对象在其内部状态改变时改变其行为。换句话说，状态模式允许对象在其状态改变时表现出不同的行为，而不是通过条件语句来实现复杂的状态转换。
#
# 适用场景
# 当一个对象的行为依赖于其状态，并且它的状态会在运行时频繁改变时。
# 当使用状态机实现某个具体的业务逻辑时，状态模式能够简化代码，例如用户的状态（在线、离线、隐藏等）。
# 当需要有多个对象共享状态的行为时，状态模式可以有效地封装状态相关的行为。
# 示例代码
# 下面是一个简单的状态模式的例子，模拟一个网络连接的状态。
class State:
    def connect(self):
        pass

    def disconnect(self):
        pass


class ConnectedState(State):
    def connect(self):
        print("Already connected.")

    def disconnect(self):
        print("Disconnecting...")
        # Change to the DisconnectedState
        connection.set_state(DisconnectedState())


class DisconnectedState(State):
    def connect(self):
        print("Connecting...")
        # Change to the ConnectedState
        connection.set_state(ConnectedState())

    def disconnect(self):
        print("Already disconnected.")


class Connection:
    def __init__(self):
        self.state = DisconnectedState()
        print("Connection initialing...")

    def set_state(self, state):
        self.state = state

    def connect(self):
        self.state.connect()

    def disconnect(self):
        self.state.disconnect()


# Client Code
print("connection = Connection(0)")
connection = Connection()
print("connection.connect(1)")
connection.connect()  # Output: Connecting...
print("connection.connect(2)")
connection.connect()  # Output: Already connected.
print("connection.disconnect(3)")
connection.disconnect()  # Output: Disconnecting...
print("connection.disconnect(4)")
connection.disconnect()  # Output: Already disconnected.

# 说明
# 在这个例子中，我们定义了一个 State 类，并创建了两个状态类 ConnectedState 和 DisconnectedState 来代表网络连接的两种状态。
# Connection 类则持有当前的状态，并委托状态类来处理连接和断开连接的请求。
#
# 通过这种方式，当 Connection 的状态发生变化时，其行为也会随之改变，而不需要在 Connection 类中写复杂的条件判断。
# 这种设计清晰、高内聚且易于扩展。
